package com.qzl.feiq;

import com.qzl.feiq.config.FeiQCache;
import com.qzl.feiq.message.Message;
import com.qzl.feiq.message.UserModel;
import com.qzl.feiq.server.UdpServer;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import com.qzl.feiq.util.FeiQUtils;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;
import javafx.scene.control.ScrollPane;

import java.util.Optional;

public class ChatApp extends Application {
    private ObservableList<UserModel> friends;
    private ListView<UserModel> friendList;
    private UserModel selectedFriend;

    @Override
    public void start(Stage primaryStage) {
        // 初始化好友列表
        friends = FXCollections.observableArrayList();
        friendList = new ListView<>(friends);
        friendList.setPrefWidth(200);

        // 设置 ListView 的单元格工厂，使其显示 senderName
        friendList.setCellFactory(param -> new ListCell<UserModel>() {
            @Override
            protected void updateItem(UserModel item, boolean empty) {
                super.updateItem(item, empty);
                if (empty || item == null) {
                    setText(null);
                } else {
                    setText(item.getSenderName());
                }
            }
        });

        // 监听好友列表的选择事件
        friendList.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
            selectedFriend = newValue;
        });
        // 添加和移除好友的按钮
        // 弹出框。搜索ip
        Button addFriendButton = new Button("添加好友");
        addFriendButton.setOnAction(e -> {
            // 创建一个输入对话框
            TextInputDialog dialog = new TextInputDialog();
            dialog.setTitle("添加好友");
            dialog.setHeaderText("请输入要添加的好友的 IP 地址");
            dialog.setContentText("IP 地址:");

            // 显示对话框并等待用户输入
            Optional<String> result = dialog.showAndWait();
            result.ifPresent(ip -> {
                // 假设这里有一个添加好友的接口方法，调用该接口添加好友
                // 例如：UdpServer.addFriend(ip); 请根据实际情况替换
                // 刷新好友列表
                refreshFriendList();
            });
        });
        // 监听用户状态改变
        userChangeListener();
        Button refreshFriendButton = new Button("刷新好友");
        refreshFriendButton.setOnAction(e -> {
            refreshFriendList();
        });
        VBox friendButtons = new VBox(10, addFriendButton, refreshFriendButton);

        // 聊天窗口
        TextFlow chatFlow = new TextFlow();
        ScrollPane scrollPane = new ScrollPane(chatFlow);
        scrollPane.setFitToWidth(true);
        scrollPane.setFitToHeight(true);
        // 添加边框和背景色
        scrollPane.setStyle("-fx-border-color: black; -fx-border-width: 2px; -fx-background-color: #f0f0f0;");
        // 增大字体行间距
        chatFlow.setStyle("-fx-line-height: 1.5em;");
        // 启动一个线程来监听消息队列
        messageListener(chatFlow, scrollPane);
        // 输入框和发送按钮
        TextField inputField = new TextField();
        Button sendButton = new Button("发送");
        sendButton.setOnAction(e -> {
            String message = inputField.getText();
            if (!message.isEmpty()) {
                // 调用发送消息的方法
                UdpServer.sendMsg(selectedFriend.getIp(), message);
                String nowTime = FeiQUtils.getNowTime();
                Text senderText = new Text("你: " + nowTime + "\n");
                senderText.setStyle("-fx-fill: blue;"); // 设置发送者信息颜色为蓝色
                Text contentText = new Text(message + "\n");
                contentText.setStyle("-fx-fill: black;"); // 设置消息内容颜色为黑色
                chatFlow.getChildren().addAll(senderText, contentText);
                inputField.clear();
                // 自动滚动到最下方 
                scrollPane.setVvalue(1.0); 
            }
        });
        // 添加回车键事件监听
        inputField.setOnAction(e -> {
            // 模拟点击发送按钮的操作
            sendButton.fire();
        });
        // 使用 HBox 组合输入框和发送按钮
        HBox inputBox = new HBox(inputField, sendButton);
        inputBox.setSpacing(10);
        inputBox.setPadding(new Insets(10));

        // 布局
        VBox leftPane = new VBox(10, friendList, friendButtons);
        leftPane.setPadding(new Insets(10));

        // VBox rightPane = new VBox(10, chatFlow, inputBox);
        // rightPane.setPadding(new Insets(10));

        // HBox mainContent = new HBox(10, leftPane, rightPane);

        BorderPane root = new BorderPane();
        root.setLeft(leftPane); // 左侧放置好友列表
        root.setCenter(scrollPane); // 中间放置聊天区域
        root.setBottom(inputBox); // 底部放置输入框和发送按钮

        // 场景和舞台
        Scene scene = new Scene(root, 800, 600);
        primaryStage.setTitle("netty-feiq");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    // 提取刷新好友列表的逻辑到单独的方法
    private void refreshFriendList() {
        friends.clear();
        FeiQCache.onlineUsers.forEach((key, value) -> {
            UserModel userModel = UserModel.builder()
                    .ip(key)
                    .senderName(value)
                    .build();
            friends.add(userModel);
        });
    }
    // 启动一个监听线程，用于接收消息

    private void messageListener(TextFlow chatFlow, ScrollPane scrollPane) {
        Thread messageListener = new Thread(() -> {
            try {
                while (true) {
                    // 阻塞等待新消息
                    Message message = FeiQCache.messageQueue.take();
                    Platform.runLater(() -> {
                        // 将消息追加到聊天窗口
                        String nowTime = FeiQUtils.getNowTime();
                        Text senderText = new Text(message.getSenderHost()+" " + nowTime + "\n");
                        senderText.setStyle("-fx-fill: blue;"); // 设置发送者信息颜色为蓝色
                        Text contentText = new Text(message.getMsg() + "\n");
                        contentText.setStyle("-fx-fill: black;"); // 设置消息内容颜色为黑色
                        chatFlow.getChildren().addAll(senderText, contentText);
                         // 自动滚动到最下方 
                        scrollPane.setVvalue(1.0); 
                    });
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                e.printStackTrace();
            }
        }, "chatListener");
        // 设置为守护线程，避免程序无法正常退出
        messageListener.setDaemon(true);
        messageListener.start();
    }

    // 启动一个线程监听用户变化
    private void userChangeListener() {
        Thread userChange = new Thread(() -> {
            try {
                while (true) {
                    FeiQCache.userQueue.take();
                    Platform.runLater(this::refreshFriendList);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                e.printStackTrace();
            }
        }, "userChangeListener");
        // 设置为守护线程，避免程序无法正常退出
        userChange.setDaemon(true);
        userChange.start();
    }

    public static void main(String[] args) throws Exception {
        UdpServer.init();
        launch(args);
    }
}